//#include <stdio.h>
//#include <stdlib.h>
//
//int n, m;
//char s[200001];
//
//int is_possible(int k) 
//{
//    int used = 0;
//    int i = 0;
//    while (i < n) 
//    {
//        if (s[i] == 'R') 
//        {
//            i++;
//            continue;
//        }
//        used++;
//        if (used > m)
//        {
//            return 0;
//        }
//        i += k;
//    }
//    return 1;
//}
//
//int find_min_k() 
//{
//    int left = 1;
//    int right = n;
//    int best = n;
//    while (left <= right) 
//    {
//        int mid = left + (right - left) / 2;
//        if (is_possible(mid))
//        {
//            best = mid;
//            right = mid - 1;
//        }
//        else 
//        {
//            left = mid + 1;
//        }
//    }
//    return best;
//}
//
//int main()
//{
//    scanf_s("%d %d", &n, &m);
//    scanf_s("%s", s);
//    printf("%d\n", find_min_k());
//    return 0;
//}

#include <stdio.h>

long long n, m, k;

long long count_leq(long long mid) 
{
    long long count = 0;
    for (long long i = 1; i <= n; i++) 
    {
        long long add = mid / i;
        if (add > m)
        {
            add = m;
        }
        count += add;
        if (count > k)
        { 
            break;
        }
    }
    return count;
}

long long find_kth() 
{
    long long left = 1;
    long long right = n * m;
    long long best = right;
    while (left <= right)
    {
        long long mid = left + (right - left) / 2;
        long long cnt = count_leq(mid);
        if (cnt >= k) 
        {
            best = mid;
            right = mid - 1;
        }
        else 
        {
            left = mid + 1;
        }
    }
    return best;
}

int main() 
{
    scanf_s("%lld %lld %lld", &n, &m, &k);
    printf("%lld\n", find_kth());
    return 0;
}